import { useEffect, useState } from "react";

export const isFalsy = (value: any) => (value === 0 ? false : !value);
// 在函数中，改变传入的对象，本身是不好的
export const cleanObject = (object: object) => {
    const result = { ...object };
    Object.keys(object).forEach((key) => {
        // @ts-ignore // 取消文件的下一行提示
        const value = object[key];
        if (isFalsy(value)) {
            // @ts-ignore // 取消文件的下一行提示
            delete result[key];
        }
    });
    return result;
};
// custom hook
export const useMount = (callback: () => void) => {
    useEffect(() => {
        callback();
    }, [callback]);
};

// export const debounce = (fn, delay) => {
//   let timeout;
//   return (...params) => {
//     if (timeout) {
//       clearTimeout(timeout);
//     }
//     timeout = setTimeout(function () {
//       fn(params);
//     }, delay);
//   };
// };
// 返回值any后面会使用泛型替代
// export const useDebounce = (value: unknown, delay?: number): any => {
//   const [debounceValue, setDebounceValue] = useState(value);
//   useEffect(() => {
//     // 每次在value发生变化的时候，设置一个定时器
//     const timeout = setTimeout(() => {
//       setDebounceValue(value);
//     }, delay);
//     // 每次在上一个useEffect处理完后运行
//     return () => clearTimeout(timeout);
//   }, [value, delay]);

//   return debounceValue;
// };

// 泛型替代上面的代码↑
export const useDebounce = <V>(value: V, delay?: number) => {
    const [debounceValue, setDebounceValue] = useState(value);
    useEffect(() => {
        // 每次在value发生变化的时候，设置一个定时器
        const timeout = setTimeout(() => {
            setDebounceValue(value);
        }, delay);
        // 每次在上一个useEffect处理完后运行
        return () => clearTimeout(timeout);
    }, [value, delay]);

    return debounceValue;
};

export const useArray = <T>(initialArray: T[]) => {
    const [value, setValue] = useState(initialArray);
    return {
        value: value,
        setValue: setValue,
        add: (item: T) => setValue([...value, item]),
        clear: () => setValue([]),
        removeIndex: (index: number) => {
            const copy = [...value];
            copy.splice(index, 1);
            setValue(copy);
        },
    };
};
